package com.cysoft.starter.log.core.repository.impl;


import com.alibaba.fastjson.JSON;
import com.cysoft.starter.log.core.model.LogEvent;
import com.cysoft.starter.log.core.model.LogInfo;
import com.cysoft.starter.log.core.repository.DataRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;


/**
 * @author 玖零
 * @version v0.0.1
 * @project cysoft-spring-boot-starter-log
 * @package com.cysoft.starter.log.core.repository.impl
 * @date 2025-02-08 16:40
 * @desc 基于事件发布方式,此工程不进行日志存储,存储交由实际监听(使用)者进行实现
 */
@Slf4j
public class EventRepository implements DataRepository  {

    /**
     * Spring 的应用上下文，用于发布事件
     */
    private final ApplicationContext applicationContext;

    /**
     * 构造函数，初始化 EventRepository 类的实例
     *
     * @param applicationContext Spring 的应用上下文，用于发布事件
     */
    public EventRepository(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    /**
     * 实现 DataRepository 接口的 output 方法，用于将日志信息进行处理并发布日志事件
     *
     * @param logInfo 要输出的日志信息对象
     */
    @Override
    public void output(LogInfo logInfo) {
        // 使用 debug 级别日志记录输出日志数据的开始信息，在生产环境可根据需要调整日志级别
        log.debug("本次请求 - 输出日志数据信息 - 开始");
        // 使用 debug 级别日志记录日志信息的详细内容
        log.debug("logInfo: {}", JSON.toJSONString(logInfo));
        // 使用 debug 级别日志记录输出日志数据的结束信息
        log.debug("本次请求 - 输出日志数据信息 - 结束");

        try {
            // 使用 info 级别日志记录即将发布事件的信息
            log.info("发布事件");
            // 创建一个日志事件对象，将日志信息传入
            LogEvent logEvent = new LogEvent(logInfo);
            // 通过应用上下文发布日志事件
            applicationContext.publishEvent(logEvent);
            // 使用 info 级别日志记录事件发布成功的信息
            log.info("事件发布成功");
        } catch (Exception e) {
            // 捕获并使用 error 级别日志记录发布事件过程中可能出现的异常
            log.error("发布日志事件时发生异常", e);
        }
    }

}
